#ifndef FACE_H
#define FACE_H

#include <QList>
#include "sommet.h"
#include "vecteur.h"
#include "math.h"

#include "boost/serialization/serialization.hpp"
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include "QList_boost.h"

/*
 *  @autheur : LEMOUEL Florian
 *  @date : 30.03.2013
 *  @version 1.0 : création de la classe complète
 *  @version 1.1 : ajout de la normale
 *  @version 1.2 : ajout de la sérialisation
 */


/*
 * Classe représentant une face
 * Une face a un ensemble de sommets la constituant.
 * On peut calculer son centre de gravité ainsi que sa normale.
 */
class Face
{
    //--------------------- Constructeurs et destructeur -------------------
public:
    //Constructeur par défault
    Face();

    //Constructeur prenant une liste de sommets
    Face(QList<Sommet*> listeSommets, Point& normale);

    //Constructeur de recopie
    Face(const Face& face);

    //Destructeur du point
    ~Face();
    //----------------------------------------------------------------------
    //--------------------- Méthodes ---------------------------------------
public:
    //On renvoie le nombre de sommets de la face
    int getNbSommets();

    //On calcule le centre de gravité de la face
    Point& getCentreGravite();

    //On renvoie la normale de la face
    Point& getNormale();

    //On rajoute un nouveau sommet à la face
    void ajouterSommet(Sommet& s);

    //Permet de calculer la normale normée de la face
    void calculerNormale();

    //Fonction de dessin de la face
    void dessiner();

private:
    //On utilise la normale de la face
    void utiliserNormale();
    //----------------------------------------------------------------------

    //--------------------- Accesseurs -------------------------------------
public:

    //On renvoie le sommet i de la face
    Sommet& getSommet(int i);

    //----------------------------------------------------------------------
    //--------------------- Surcharge des opérateurs -----------------------

    //----------------------------------------------------------------------
    //--------------------- Attributs --------------------------------------
private:

    //Liste des sommets de la face
    QList<Sommet*> _sommets;

    //Normale de la face
    Point* _normale;

    //----------------------------------------------------------------------
    //--------------------- Sérialisation ----------------------------------
private:

   friend class boost::serialization::access;

   template<class Archive>
   void serialize(Archive & ar, const unsigned int version) {
        ar & _normale;
        ar & _sommets;
   }
   //----------------------------------------------------------------------
};

#endif // FACE_H
